from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

# 全局 DB 实例，将在 app.py 中初始化
db = SQLAlchemy()


class User(db.Model):
    """用户表：存储家长信息、孩子信息和设置"""
    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)  # 登录名/手机号
    password_hash = db.Column(db.String(128), nullable=False)  # 密码哈希

    child_name = db.Column(db.String(80), default='孩子')  # 孩子昵称
    grade = db.Column(db.Integer, default=1)  # 孩子当前年级 (1-6)，决定难度

    # 定时提醒，格式如 '19:00'
    reminder_time = db.Column(db.String(5), default='18:00')

    created_at = db.Column(db.DateTime, default=datetime.utcnow)


class DailyRecord(db.Model):
    """每日记录表：记录用户每天的完成量和正确率"""
    __tablename__ = 'daily_record'

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    date = db.Column(db.Date, nullable=False, default=datetime.utcnow().date())

    total_completed = db.Column(db.Integer, default=0)  # 当日完成的题目总量
    correct_count = db.Column(db.Integer, default=0)  # 当日正确的题目数量
    accuracy_rate = db.Column(db.Float, default=0.0)  # 当日正确率

    # 复合唯一索引，确保一个用户一天只有一条记录
    __table_args__ = (db.UniqueConstraint('user_id', 'date', name='_user_date_uc'),)


class WrongQuestion(db.Model):
    """错题本：记录用户做错的题目详情和次数"""
    __tablename__ = 'wrong_question'

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    content = db.Column(db.String(100), nullable=False)  # 题目内容，如 "15 + 8 ="
    correct_answer = db.Column(db.String(20), nullable=False)  # 正确答案

    mistake_count = db.Column(db.Integer, default=1)  # 累计错误次数
    last_mistake_date = db.Column(db.DateTime, default=datetime.utcnow)

    # 题目和用户ID的复合唯一索引，确保同一题目只存储一次，只更新次数
    __table_args__ = (db.UniqueConstraint('user_id', 'content', name='_user_content_uc'),)
